package com.shujia.wyh.day22.homework;

import java.util.*;

/*
        3.实现List和Map数据的转换。具体要求如下：
            功能1：定义方法public void listToMap( ){ }将List中Student元素封装到Map中
                1)使用构造方法Student(int id,String name,int age,String sex )创建多个学生信息并加入List
                2)遍历List，输出每个Student信息
                3)将List中数据放入Map，使用Student的id属性作为key，使用Student对象信息作为value
                4)遍历Map，输出每个Entry的key和value
            功能2：定义方法public void mapToList( ){ }将Map中Student映射信息封装到List
                1)创建实体类StudentEntry，可以存储Map中每个Entry的信息
                2)使用构造方法Student(int id,String name,int age,String sex )创建多个学生信息，并使用Student的id属性作为key，存入Map
                3)创建List对象，每个元素类型是StudentEntry
                4)将Map中每个Entry信息放入List对象
 */
public class Test3 {
    public static void main(String[] args) {
        //创建List集合对象
        List<Student> list = new ArrayList<>();
        //创建学生对象
        Student s1 = new Student(1001, "小花", 18, "女");
        Student s2 = new Student(1002, "小白", 19, "男");
        Student s3 = new Student(1003, "小黑", 17, "男");
        Student s4 = new Student(1004, "小红", 16, "女");
        //将学生对象添加到集合中
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        //遍历List，输出每个Student信息
        for (Student student : list) {
            System.out.println(student);
        }
        //将List中数据放入Map，使用Student的id属性作为key，使用Student对象信息作为value
        listToMap(list);

        System.out.println("========================================");
        //创建map集合对象
        Map<Integer, Student> map = new HashMap<>();
        //将学生对象添加到集合中
        map.put(s1.getId(), s1);
        map.put(s2.getId(), s2);
        map.put(s3.getId(), s3);
        map.put(s4.getId(), s4);

        mapToList(map);


    }


    public static <K, V> void mapToList(Map<K, V> map) {
        //创建List集合
        List<StudentEntry<K, V>> list = new ArrayList<>();
        //取出map中的元素，封装成StudentEntry类型，存放到list集合中
        Set<Map.Entry<K, V>> entries = map.entrySet();
        for (Map.Entry<K, V> entry : entries) {
            StudentEntry<K, V> studentEntry = new StudentEntry<>(entry);
            list.add(studentEntry);
        }
        //遍历List集合对象
        for (StudentEntry<K, V> studentEntry : list) {
            Map.Entry<K, V> mapEntry = studentEntry.getMapEntry();
            K id = mapEntry.getKey();
            V student = mapEntry.getValue();
            System.out.println(id + "---" + student);
        }


    }


    //定义成一个泛型方法
    public static <T> void listToMap(List<T> list) {
        //创建一个Map集合
        HashMap<Integer, Student> map = new HashMap<>();
        //遍历list集合，取出id和信息
        for (T t : list) {
            Student s = (Student) t;
            int id = s.getId();
            //将学生对象添加到map集合中
            map.put(id, s);
        }

        //遍历Map，输出每个Entry的key和value
        Set<Map.Entry<Integer, Student>> entries = map.entrySet();
        for (Map.Entry<Integer, Student> keyValue : entries) {
            Integer id = keyValue.getKey();
            Student student = keyValue.getValue();
            System.out.println("学号：" + id + ",信息：" + student);
        }
    }
}
